{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import tensorflow as tf\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns\n",
    "from tqdm import tqdm\n",
    "import random\n",
    "import time\n",
    "sns.set()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "def get_vocab(file, lower = False):\n",
    "    with open(file, 'r') as fopen:\n",
    "        data = fopen.read()\n",
    "    if lower:\n",
    "        data = data.lower()\n",
    "    vocab = list(set(data))\n",
    "    return data, vocab\n",
    "\n",
    "def embed_to_onehot(data, vocab):\n",
    "    onehot = np.zeros((len(data), len(vocab)), dtype = np.float32)\n",
    "    for i in range(len(data)):\n",
    "        onehot[i, vocab.index(data[i])] = 1.0\n",
    "    return onehot"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "text, text_vocab = get_vocab('shakespeare.txt', lower = False)\n",
    "onehot = embed_to_onehot(text, text_vocab)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "65"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(text_vocab)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "learning_rate = 0.01\n",
    "batch_size = 32\n",
    "sequence_length = 64\n",
    "epoch = 3000\n",
    "num_layers = 2\n",
    "size_layer = 256\n",
    "possible_batch_id = range(len(text) - sequence_length - 1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "class Model:\n",
    "    def __init__(\n",
    "        self, num_layers, size_layer, dimension, sequence_length, learning_rate\n",
    "    ):\n",
    "        def lstm_cell():\n",
    "            return tf.nn.rnn_cell.LSTMCell(\n",
    "                size_layer, sequence_length\n",
    "            )\n",
    "\n",
    "        self.X = tf.placeholder(tf.float32, (None, None, dimension))\n",
    "        self.Y = tf.placeholder(tf.float32, (None, None, dimension))\n",
    "        attention_mechanism = tf.contrib.seq2seq.BahdanauAttention(\n",
    "            num_units = size_layer, memory = self.X\n",
    "        )\n",
    "        self.rnn_cells = tf.contrib.seq2seq.AttentionWrapper(\n",
    "            cell = tf.nn.rnn_cell.MultiRNNCell(\n",
    "                [lstm_cell() for _ in range(num_layers)]\n",
    "            ),\n",
    "            attention_mechanism = attention_mechanism,\n",
    "            attention_layer_size = size_layer,\n",
    "        )\n",
    "        self.initial_state = self.rnn_cells.zero_state(\n",
    "            dtype = tf.float32, batch_size = tf.shape(self.X)[0]\n",
    "        )\n",
    "        self.outputs, self.last_state = tf.nn.dynamic_rnn(\n",
    "            self.rnn_cells,\n",
    "            self.X,\n",
    "            initial_state = self.initial_state,\n",
    "            dtype = tf.float32,\n",
    "        )\n",
    "        rnn_W = tf.Variable(tf.random_normal((size_layer, dimension)))\n",
    "        rnn_B = tf.Variable(tf.random_normal([dimension]))\n",
    "        self.logits = (\n",
    "            tf.matmul(tf.reshape(self.outputs, [-1, size_layer]), rnn_W) + rnn_B\n",
    "        )\n",
    "        y_batch_long = tf.reshape(self.Y, [-1, dimension])\n",
    "        self.cost = tf.reduce_mean(\n",
    "            tf.nn.softmax_cross_entropy_with_logits(\n",
    "                logits = self.logits, labels = y_batch_long\n",
    "            )\n",
    "        )\n",
    "        self.optimizer = tf.train.RMSPropOptimizer(learning_rate, 0.9).minimize(\n",
    "            self.cost\n",
    "        )\n",
    "        self.correct_pred = tf.equal(\n",
    "            tf.argmax(self.logits, 1), tf.argmax(y_batch_long, 1)\n",
    "        )\n",
    "        self.accuracy = tf.reduce_mean(tf.cast(self.correct_pred, tf.float32))\n",
    "        seq_shape = tf.shape(self.outputs)\n",
    "        self.final_outputs = tf.reshape(\n",
    "            tf.nn.softmax(self.logits), (seq_shape[0], seq_shape[1], dimension)\n",
    "        )\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:From <ipython-input-6-bd12dd62bde5>:39: softmax_cross_entropy_with_logits (from tensorflow.python.ops.nn_ops) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "\n",
      "Future major versions of TensorFlow will allow gradients to flow\n",
      "into the labels input on backprop by default.\n",
      "\n",
      "See `tf.nn.softmax_cross_entropy_with_logits_v2`.\n",
      "\n"
     ]
    }
   ],
   "source": [
    "tf.reset_default_graph()\n",
    "sess = tf.InteractiveSession()\n",
    "model = Model(num_layers, size_layer, len(text_vocab), sequence_length, learning_rate)\n",
    "sess.run(tf.global_variables_initializer())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "And\n"
     ]
    }
   ],
   "source": [
    "split_text = text.split()\n",
    "tag = split_text[np.random.randint(0, len(split_text))]\n",
    "print(tag)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "def train_random_sequence():\n",
    "    LOST, ACCURACY = [], []\n",
    "    pbar = tqdm(range(epoch), desc = 'epoch')\n",
    "    batch_x = np.zeros((batch_size, sequence_length, len(text_vocab)))\n",
    "    batch_y = np.zeros((batch_size, sequence_length, len(text_vocab)))\n",
    "    batch_id = random.sample(possible_batch_id, batch_size)\n",
    "    for n in range(sequence_length):\n",
    "        id1 = [k + n for k in batch_id]\n",
    "        id2 = [k + n + 1 for k in batch_id]\n",
    "        batch_x[:,n,:] = onehot[id1, :]\n",
    "        batch_y[:,n,:] = onehot[id2, :]\n",
    "    last_state, _ = sess.run([model.last_state, model.optimizer], feed_dict = {model.X: batch_x,\n",
    "                                                          model.Y: batch_y})\n",
    "    for i in pbar:\n",
    "        last_time = time.time()\n",
    "        batch_x = np.zeros((batch_size, sequence_length, len(text_vocab)))\n",
    "        batch_y = np.zeros((batch_size, sequence_length, len(text_vocab)))\n",
    "        batch_id = random.sample(possible_batch_id, batch_size)\n",
    "        for n in range(sequence_length):\n",
    "            id1 = [k + n for k in batch_id]\n",
    "            id2 = [k + n + 1 for k in batch_id]\n",
    "            batch_x[:,n,:] = onehot[id1, :]\n",
    "            batch_y[:,n,:] = onehot[id2, :]\n",
    "        last_state, _, loss, accuracy = sess.run([model.last_state, model.optimizer, \n",
    "                                                  model.cost, model.accuracy], \n",
    "                                       feed_dict = {model.X: batch_x, \n",
    "                                                    model.Y: batch_y,\n",
    "                                                    model.initial_state: last_state})\n",
    "        ACCURACY.append(accuracy); LOST.append(loss)\n",
    "        pbar.set_postfix(cost = loss, accuracy = accuracy)\n",
    "    return LOST, ACCURACY"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "epoch: 100%|██████████| 3000/3000 [06:46<00:00,  7.06it/s, accuracy=0.133, cost=3.28]   \n"
     ]
    }
   ],
   "source": [
    "LOST, ACCURACY = train_random_sequence()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 1080x360 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize = (15, 5))\n",
    "plt.subplot(1, 2, 1)\n",
    "EPOCH = np.arange(len(LOST))\n",
    "plt.plot(EPOCH, LOST)\n",
    "plt.xlabel('epoch'); plt.ylabel('loss')\n",
    "plt.subplot(1, 2, 2)\n",
    "plt.plot(EPOCH, ACCURACY)\n",
    "plt.xlabel('epoch'); plt.ylabel('accuracy')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "sentence_generated = tag\n",
    "onehot = embed_to_onehot(tag, text_vocab)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [],
   "source": [
    "def generate_based_sequence(length_sentence, argmax = False):\n",
    "    sentence_generated = tag\n",
    "    onehot = embed_to_onehot(tag, text_vocab)\n",
    "    batch_x = np.zeros((1, 1, len(text_vocab)))\n",
    "    batch_x[:, 0, :] = onehot[0, :]\n",
    "    last_state, prob = sess.run(\n",
    "            [model.last_state, model.final_outputs],\n",
    "            feed_dict = {model.X: batch_x},\n",
    "    )\n",
    "    for i in range(1, len(tag), 1):\n",
    "        batch_x = np.zeros((1, 1, len(text_vocab)))\n",
    "        batch_x[:, 0, :] = onehot[i, :]\n",
    "        last_state, prob = sess.run(\n",
    "            [model.last_state, model.final_outputs],\n",
    "            feed_dict = {model.X: batch_x, model.initial_state: last_state},\n",
    "        )\n",
    "\n",
    "    for i in range(length_sentence):\n",
    "        if argmax:\n",
    "            char = np.argmax(prob[0][0])\n",
    "        else:\n",
    "            char = np.random.choice(range(len(text_vocab)), p = prob[0][0])\n",
    "        element = text_vocab[char]\n",
    "        sentence_generated += element\n",
    "        onehot = embed_to_onehot(element, text_vocab)\n",
    "        batch_x = np.zeros((1, 1, len(text_vocab)))\n",
    "        batch_x[:, 0, :] = onehot[0, :]\n",
    "        last_state, prob = sess.run(\n",
    "            [model.last_state, model.final_outputs],\n",
    "            feed_dict = {model.X: batch_x, model.initial_state: last_state},\n",
    "        )\n",
    "\n",
    "    return sentence_generated"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Anddqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\n"
     ]
    }
   ],
   "source": [
    "print(generate_based_sequence(1000,True))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "AnddPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP\n"
     ]
    }
   ],
   "source": [
    "print(generate_based_sequence(1000,False))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.8"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
